home *** CD-ROM | disk | FTP | other *** search
/ Computer Shopper 242 / Issue 242 - April 2008 - DPCS0408DVD.ISO / Software Money Savers / VirtualDub / Source / VirtualDub-1.7.7-src.7z / src / h / vd2 / system / profile.h < prev    next >
Encoding:
C/C++ Source or Header  |  2006-03-14  |  4.3 KB  |  141 lines

  1. //    VirtualDub - Video processing and capture application
  2. //    System library component
  3. //    Copyright (C) 1998-2004 Avery Lee, All Rights Reserved.
  4. //
  5. //    Beginning with 1.6.0, the VirtualDub system library is licensed
  6. //    differently than the remainder of VirtualDub.  This particular file is
  7. //    thus licensed as follows (the "zlib" license):
  8. //
  9. //    This software is provided 'as-is', without any express or implied
  10. //    warranty.  In no event will the authors be held liable for any
  11. //    damages arising from the use of this software.
  12. //
  13. //    Permission is granted to anyone to use this software for any purpose,
  14. //    including commercial applications, and to alter it and redistribute it
  15. //    freely, subject to the following restrictions:
  16. //
  17. //    1.    The origin of this software must not be misrepresented; you must
  18. //        not claim that you wrote the original software. If you use this
  19. //        software in a product, an acknowledgment in the product
  20. //        documentation would be appreciated but is not required.
  21. //    2.    Altered source versions must be plainly marked as such, and must
  22. //        not be misrepresented as being the original software.
  23. //    3.    This notice may not be removed or altered from any source
  24. //        distribution.
  25.  
  26. #ifndef f_VD2_SYSTEM_PROFILE_H
  27. #define f_VD2_SYSTEM_PROFILE_H
  28.  
  29. #include <vd2/system/vdtypes.h>
  30. #include <vd2/system/thread.h>
  31. #include <vector>
  32.  
  33. class VDRTProfiler;
  34.  
  35. void VDInitProfilingSystem();
  36. void VDDeinitProfilingSystem();
  37. VDRTProfiler *VDGetRTProfiler();
  38.  
  39. //
  40. //    VDRTProfiler        Real-time profiler
  41. //
  42. //    This class forms the base for a very simple real-time profiler: threads
  43. //    record events in channels, and periodically, someone swaps the active
  44. //    recording array with a second array, and draws the sampled events off
  45. //    that array.  In VirtualDub, this is done via RTProfileDisplay.  Events
  46. //    are sampled via the high-performance counter in Win32, but clients need
  47. //    never know this fact.
  48. //
  49. //    All methods in VDRTProfiler are thread-safe.  However, it is assumed
  50. //    that only one client will be calling Swap() and accessing the Paint
  51. //    channel set.  Swap() should be called from rather low-level code as
  52. //    it may introduce deadlocks otherwise.
  53. //
  54. //    Strings passed to VDRTProfiler must be constant data in the main EXE.
  55. //    No dynamic strings or DLLs.  The reason is that there is an
  56. //    indefinite delay between a call to FreeChannel() and the last time
  57. //    data from that channel is displayed.
  58. //
  59. //    Channels are not restricted to a particular thread; it is permissible
  60. //    to allocate a channel in one thread and use it in another.  However,
  61. //    channels must not be simultaneously used by two threads -- that will
  62. //    generate interesting output.
  63. //
  64. class VDRTProfiler {
  65. public:
  66.     VDRTProfiler();
  67.     ~VDRTProfiler();
  68.  
  69.     void BeginCollection();
  70.     void EndCollection();
  71.     void Swap();
  72.  
  73.     bool IsEnabled() const { return mbEnableCollection; }
  74.  
  75.     int AllocChannel(const char *name);
  76.     void FreeChannel(int ch);
  77.     void BeginEvent(int channel, uint32 color, const char *name);
  78.     void EndEvent(int channel);
  79.  
  80. public:
  81.     struct Event {
  82.         uint64        mStartTime;
  83.         uint64        mEndTime;            // only last 32 bits of counter
  84.         uint32        mColor;
  85.         const char *mpName;
  86.     };
  87.  
  88.     struct Channel {
  89.         const char            *mpName;
  90.         bool                mbEventPending;
  91.         std::vector<Event>    mEventList;
  92.     };
  93.  
  94.     typedef std::vector<Channel> tChannels;
  95.  
  96.     VDCriticalSection        mcsChannels;
  97.     tChannels                mChannelArray;
  98.     tChannels                mChannelArrayToPaint;
  99.     uint64                    mPerfFreq;
  100.     uint64                    mSnapshotTime;
  101.  
  102.     volatile bool            mbEnableCollection;
  103. };
  104.  
  105. //
  106. //    VDRTProfileChannel
  107. //
  108. //    This helper simply makes channel acquisition easier.  It automatically
  109. //    stubs out if no profiler is available.  However, it's still advisable
  110. //    not to call this from your inner loop!
  111. //
  112. class VDRTProfileChannel {
  113. public:
  114.     VDRTProfileChannel(const char *name)
  115.         : mpProfiler(VDGetRTProfiler())
  116.         , mProfileChannel(mpProfiler ? mpProfiler->AllocChannel(name) : 0)
  117.     {
  118.     }
  119.     ~VDRTProfileChannel() {
  120.         if (mpProfiler)
  121.             mpProfiler->FreeChannel(mProfileChannel);
  122.     }
  123.  
  124.     void Begin(uint32 color, const char *name) {
  125.         if (mpProfiler)
  126.             mpProfiler->BeginEvent(mProfileChannel, color, name);
  127.     }
  128.  
  129.     void End() {
  130.         if (mpProfiler)
  131.             mpProfiler->EndEvent(mProfileChannel);
  132.     }
  133.  
  134. protected:
  135.     VDRTProfiler *const mpProfiler;
  136.     int mProfileChannel;
  137. };
  138.  
  139. #endif
  140.  
  141.